#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;

//class Date
//{
//
//public:
//
//	// 获取某年某月的天数
//	int GetMonthDay(int year, int month)
//	{
//		int monthday[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
//		if (month != 2)
//		{
//			return monthday[month];
//		}
//		else
//		{
//			if ((year % 4 == 0 && year % 100 != 0) || year % 100 == 0)
//				return 29;
//			else
//				return 28;
//		}
//	}
//
//
//	// 全缺省的构造函数
//	Date(int year = 1900, int month = 1, int day = 1)
//	{
//		_year = year;
//		_month = month;
//		_day = day;
//	}
//
//	// 拷贝构造函数
//   // d2(d1)
//	Date(const Date& d)
//	{
//		_year = d._year;
//		_month = d._month;
//		_day = d._day;
//	}
//
//
//	// 赋值运算符重载
//	// d2 = d3 -> d2.operator=(&d2, d3)
//
//	Date& operator=(const Date& d)
//	{
//		_year = d._year;
//		_month = d._month;
//		_day = d._day;
//
//
//		return *this;
//	}
//
//	// 析构函数
//	~Date()
//	{
//		_year = 0;
//		_month = 0;
//		_day = 0;
//	}
//
//
//
//
//	Date& operator+=(int day)
//	{
//		//_day+day不大于当前月份的天数，直接结束
//		_day += day;
//		//_day+day大于当前月份的天数，进入while
//		while (_day > GetMonthDay(_year, _month))
//		{
//			//总天数 - 一个月的天数。减一次，_month就加一次
//			_day -= GetMonthDay(_year, _month);
//
//			++_month;
//
//			if (_month == 13)
//			{
//				_year++;
//				_month = 1;
//			}
//		}
//
//		return *this;
//	}
//
//
//	// 日期+天数
//	Date operator+(int day)
//	{
//		Date tmp = *this;
//
//		tmp._day += day;
//		while (tmp._day > GetMonthDay(tmp._year, tmp._month))
//		{
//			//总天数 - 一个月的天数。减一次，_month就加一次
//			tmp._day -= GetMonthDay(tmp._year, tmp._month);
//
//			++tmp._month;
//
//			if (tmp._month == 13)
//			{
//				tmp._year++;
//				tmp._month = 1;
//			}
//		}
//		return tmp;
//
//	}
//
//
//
//	// 日期-天数
//	Date operator-(int day)
//	{
//		Date tmp = *this;
//		//2024 10 11 - 30 
//		tmp._day -= day;
//
//		while (tmp._day < 1)
//		{
//			--tmp._month;
//
//			tmp._day += GetMonthDay(tmp._year, tmp._month);
//
//
//			if (tmp._month == 0)
//			{
//				tmp._year--;
//				tmp._month = 12;
//			}
//		}
//		return tmp;
//
//	}
//
//
//
//	// 日期-=天数
//	Date& operator-=(int day)
//	{
//
//		//2024 10 11 - 30 
//		_day -= day;
//
//		while (_day < 1)
//		{
//			--_month;
//
//			_day += GetMonthDay(_year, _month);
//
//
//			if (_month == 0)
//			{
//				_year--;
//				_month = 12;
//			}
//		}
//		return *this;
//
//
//	}
//
//
//
//	// 前置++
//	Date& operator++()
//	{
//		_day += 1;
//		if (_day > GetMonthDay(_year, _month))
//		{
//			_month++;
//			_day = 1;
//		}
//
//		return *this;
//	}
//
//
//
//	// 后置++
//	Date operator++(int)
//	{
//		_day += 1;
//		if (_day > GetMonthDay(_year, _month))
//		{
//			_month++;
//			_day = 1;
//		}
//
//		return *this;
//
//	}
//
//
//
//	// 后置--
//	Date operator--(int)
//	{
//		_day -= 1;
//
//		if (_day == 0)
//		{
//			_month--;
//
//			_day = GetMonthDay(_year, _day);
//
//		}
//		return *this;
//	}
//
//
//
//	// 前置--
//	Date& operator--()
//	{
//		_day -= 1;
//
//		if (_day == 0)
//		{
//			_month--;
//
//			_day = GetMonthDay(_year, _day);
//
//		}
//		return *this;
//	}
//
//
//
//	// >运算符重载
//	bool operator>(const Date& d)
//	{
//		if (_year < d._year)
//			return false;
//
//		if (_year == d._year && _month < d._month)
//			return false;
//
//		if (_year == d._year && _month == d._month && _day < d._day)
//			return false;
//
//
//		return true;
//	}
//
//
//
//	// ==运算符重载
//	bool operator==(const Date& d)
//	{
//		return _year == d._year && _month == d._month && _day == d._day;
//	}
//
//
//
//	// >=运算符重载
//	bool operator >= (const Date& d)
//	{
//		if (_year != d._year)
//			return false;
//
//		if (_year == d._year && _month != d._month)
//			return false;
//
//		if (_year == d._year && _month == d._month && _day <= d._day)
//			return false;
//
//		return true;
//	}
//
//
//
//	// <运算符重载
//	bool operator < (const Date& d)
//	{
//		if (_year < d._year)
//			return true;
//
//		if (_year == d._year && _month < d._month)
//			return true;
//
//		if (_year == d._year && _month == d._month && _day < d._day)
//			return true;
//
//		return false;
//
//
//	}
//
//
//
//	// <=运算符重载
//	bool operator <= (const Date& d)
//	{
//		if (_year != d._year)
//			return false;
//
//		if (_year == d._year && _month != d._month)
//			return false;
//
//		if (_year == d._year && _month == d._month && _day >= d._day)
//			return false;
//
//		return true;
//
//	}
//
//
//
//	// !=运算符重载
//	bool operator != (const Date& d)
//	{
//		return _year != d._year && _month != d._month && _day != d._day;
//	}
//
//
//
//	// 日期-日期 返回天数
//	int operator-(const Date& d);
//
//	//打印
//	void Print()
//	{
//		cout << _year << "/" << _month << "/" << _day << endl;
//	}
//
//private:
//
//	int _year;
//	int _month;
//	int _day;
//};
//int main()
//{
//	//Date d1;
//	//printf("d1:");
//	//d1.Print();
//	//printf("\n");
//
//	//Date d2(2024, 10, 11);
//	//printf("d2:");
//	//d2.Print();
//	//printf("\n");
//
//	//printf("100天后的日期\n");
//	//Date tmp1 = d1.operator+(100);
//	//tmp1.Print();
//	//printf("成为100天后的日期\n");
//	//d1.operator+=(100);
//	//d1.Print();
//	//printf("100天前的日期\n");
//	//Date tmp2 = d1.operator-(100);
//	//tmp2.Print();
//	//printf("成为100天前的日期\n");
//	//d1.operator-=(100);
//	//d1.Print();
//
//	//printf("判断d1是和d2相等\n");
//	//bool ret1 = d1.operator==(d2);
//	//printf("%d\n", ret1);
//
//	//printf("判断d1!=d2\n");
//	//bool ret6 = d1.operator!=(d2);
//	//printf("%d\n", ret6);
//
//	//printf("判断d1>d2？\n");
//	//bool ret2 = d1.operator>(d2);
//	//printf("%d\n", ret2);
//
//	//printf("判断d1<d2？\n");
//	//bool ret3 = d1.operator<(d2);
//	//printf("%d\n", ret3);
//
//
//	//printf("判断d1>=d2？\n");
//	//bool ret4 = d1.operator>=(d2);
//	//printf("%d\n", ret4);
//
//	//printf("判断d1<=d2？\n");
//	//bool ret5 = d1.operator<=(d2);
//	//printf("%d\n", ret5);
//
//	
//
//	return 0;
//}

class Date

{

public:

	// 获取某年某月的天数

	int GetMonthDay(int year, int month)

	{

		static int days[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

		int day = days[month];

		if (month == 2

			&& ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)))

		{

			day += 1;

		}

		return day;

	}



	// 全缺省的构造函数

	Date(int year = 1900, int month = 1, int day = 1)

	{

		if (year < 1900

			|| month < 1 || month > 12

			|| day < 1 || day > GetMonthDay(year, month))

		{

			cout << "非法日期" << endl;

		}



		_year = year;

		_month = month;

		_day = day;

	}



	// 拷贝构造函数

  // d2(d1)

	Date(const Date& d)

	{

		this->_year = d._year;

		_month = d._month;

		_day = d._day;

	}



	// 赋值运算符重载

  // d2 = d3 -> d2.operator=(&d2, d3)

	Date& operator=(const Date& d)

	{

		if (this != &d)

		{

			this->_year = d._year;

			this->_month = d._month;

			this->_day = d._day;

		}



		return *this;

	}



	// 析构函数

	~Date()

	{

		// 清理工作

	}



	void Print()

	{

		cout << _year << "-" << _month << "-" << _day << endl;

	}



	// 日期+=天数

  // d1 += 10

  // d1 += -10

	Date& operator+=(int day)

	{

		if (day < 0)

		{

			return *this -= -day;

		}



		_day += day;

		while (_day > GetMonthDay(_year, _month))

		{

			_day -= GetMonthDay(_year, _month);

			_month++;

			if (_month == 13)

			{

				_year++;

				_month = 1;

			}

		}



		return *this;

	}



	// 日期+天数

  // d + 10

	Date operator+(int day)

	{

		Date ret(*this);

		ret += day;



		return ret;

	}



	// 日期-天数

	Date operator-(int day)

	{

		Date ret(*this);

		ret -= day;

		return ret;

	}



	// 日期-=天数

 // d -= 100

 // d -= -100

	Date& operator-=(int day)

	{

		if (day < 0)

		{

			return *this += -day;

		}



		_day -= day;

		while (_day <= 0)

		{

			--_month;

			if (_month == 0)

			{

				--_year;

				_month = 12;

			}

			_day += GetMonthDay(_year, _month);

		}



		return *this;

	}



	// 前置++

  // ++d -> d.operator++(&d)

	Date& operator++()

	{

		*this += 1;

		return *this;

	}



	// 后置++

  // d++ -> d.operator++(&d, 0)

	Date operator++(int)

	{

		Date ret(*this);

		*this += 1;

		return ret;

	}



	// // 后置--

	Date operator--(int)

	{

		Date ret(*this);

		*this -= 1;

		return ret;

	}



	// 前置--

	Date& operator--()

	{

		*this -= 1;

		return *this;

	}



	// d1 > d2

	  // >运算符重载

	bool operator>(const Date& d)

	{

		if (_year > d._year)

		{

			return true;

		}

		else if (_year == d._year)

		{

			if (_month > d._month)

			{

				return true;

			}

			else if (_month == d._month)

			{

				if (_day > d._day)

				{

					return true;

				}

			}

		}



		return false;

	}



	// ==运算符重载

	bool operator==(const Date& d)

	{

		return _year == d._year

			&& _month == d._month

			&& _day == d._day;

	}



	// 下面复用上面两个的实现

	// >=运算符重载

	bool operator >= (const Date& d)

	{

		return *this > d || *this == d;

	}



	// <运算符重载

	bool operator < (const Date& d)

	{

		return !(*this >= d);

	}



	// <=运算符重载

	bool operator <= (const Date& d)
	{
		return !(*this > d);
	}



	// !=运算符重载
	bool operator != (const Date& d)

	{
		return !(*this == d);
	}

	// d1 - d2
	// 日期-日期 返回天数

	int operator-(const Date& d)
	{
		int flag = 1;
		Date max = *this;
		Date min = d;

		if (*this < d)
		{
			max = d;
			min = *this;
			flag = -1;
		}
		int day = 0;
		while (min < max)
		{
			++(min);
			++day;

		}
		return day * flag;

	}

private:

	int _year;
	int _month;
	int _day;

};